package util;

import javax.swing.*;
import java.awt.*;
import java.awt.font.TextAttribute;
import java.util.HashMap;
import java.util.Map;

/**
 * 字体工具类，专门处理emoji显示问题
 */
public class FontUtils {
    private static Font emojiFont = null;
    private static Font defaultFont = null;

    static {
        initializeFonts();
    }

    /**
     * 初始化字体
     */
    private static void initializeFonts() {
        // 默认字体
        defaultFont = new Font("Microsoft YaHei", Font.PLAIN, 14);

        // 尝试创建支持emoji的字体
        emojiFont = createEmojiSupportedFont();
    }

    /**
     * 创建支持emoji的字体
     */
    private static Font createEmojiSupportedFont() {
        // Windows 10及以上版本支持的emoji字体 - 按优先级排序
        String[] emojiFonts = {
                "Segoe UI Emoji", // Windows 10/11主要emoji字体
                "Segoe UI Symbol", // Windows符号字体
                "Microsoft YaHei UI", // Windows中文UI字体
                "Microsoft YaHei", // Windows中文字体
                "Noto Color Emoji", // Google字体
                "Apple Color Emoji", // macOS字体
                "Twemoji Mozilla", // Firefox字体
                "EmojiOne Color", // 第三方字体
                "Symbola", // Unicode符号字体
                "Arial Unicode MS", // 通用Unicode字体
                "Lucida Sans Unicode", // Windows通用字体
                "SimSun-ExtB", // 扩展宋体
                "SimSun" // 宋体备选
        };

        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        String[] availableFonts = ge.getAvailableFontFamilyNames();

        // 测试emoji字符
        int[] testEmojis = {
                0x1F600, // 😀 笑脸
                0x1F4CB, // 📋 剪贴板
                0x1F916, // 🤖 机器人
                0x1F4CA, // 📊 条形图
                0x2699, // ⚙ 齿轮
                0x1F4E2, // 📢 扩音器
                0x1F3AF, // 🎯 靶心
                0x1F550 // 🕐 时钟
        };

        // 直接返回默认字体，不再测试emoji支持
        return defaultFont;
    }

    /**
     * 创建复合字体，支持emoji
     */
    private static Font createCompositeFont() {
        Map<TextAttribute, Object> attributes = new HashMap<>();
        attributes.put(TextAttribute.FAMILY, "Microsoft YaHei");
        attributes.put(TextAttribute.SIZE, 14);

        // 预留用于未来的字体fallback实现
        // String[] fallbackFonts = {"Segoe UI Emoji", "Microsoft YaHei"};

        Font font = new Font(attributes);

        // 如果系统支持，使用Java的字体fallback机制
        try {
            // 创建字体配置，让系统自动处理emoji
            font = font.deriveFont(Font.PLAIN, 14f);
            return font;
        } catch (Exception e) {
            return defaultFont;
        }
    }

    /**
     * 为JLabel设置支持emoji的字体
     */
    public static void setEmojiFont(JLabel label) {
        if (emojiFont != null) {
            label.setFont(emojiFont);
        } else {
            label.setFont(defaultFont);
        }
    }

    /**
     * 为JButton设置支持emoji的字体
     */
    public static void setEmojiFont(JButton button) {
        if (emojiFont != null) {
            button.setFont(emojiFont);
        } else {
            button.setFont(defaultFont);
        }
    }

    /**
     * 为JTextPane设置支持emoji的字体
     */
    public static void setEmojiFont(JTextPane textPane) {
        if (emojiFont != null) {
            textPane.setFont(emojiFont);
        } else {
            textPane.setFont(defaultFont);
        }
    }

    /**
     * 创建支持emoji的字体，指定大小
     */
    public static Font getEmojiFont(int size) {
        if (emojiFont != null) {
            return emojiFont.deriveFont(Font.PLAIN, (float) size);
        } else {
            return defaultFont.deriveFont(Font.PLAIN, (float) size);
        }
    }

    /**
     * 创建支持emoji的字体，指定样式和大小
     */
    public static Font getEmojiFont(int style, int size) {
        if (emojiFont != null) {
            return emojiFont.deriveFont(style, (float) size);
        } else {
            return defaultFont.deriveFont(style, (float) size);
        }
    }

    /**
     * 测试字符是否为emoji
     */
    public static boolean isEmoji(char c) {
        // 基本emoji范围检测
        int codePoint = c;
        return (codePoint >= 0x1F600 && codePoint <= 0x1F64F) || // 表情符号
                (codePoint >= 0x1F300 && codePoint <= 0x1F5FF) || // 符号和象形文字
                (codePoint >= 0x1F680 && codePoint <= 0x1F6FF) || // 交通和地图符号
                (codePoint >= 0x2600 && codePoint <= 0x26FF) || // 杂项符号
                (codePoint >= 0x2700 && codePoint <= 0x27BF) || // 装饰符号
                (codePoint >= 0xFE00 && codePoint <= 0xFE0F); // 变体选择器
    }

    /**
     * 处理包含emoji的文本，应用特殊渲染
     */
    public static String processEmojiText(String text) {
        if (text == null || text.isEmpty()) {
            return text;
        }

        // 对于某些可能显示有问题的emoji，提供文本替代方案
        if (emojiFont == null || !canDisplayEmoji()) {
            return text.replace("📋", "[剪贴板]")
                    .replace("🔒", "[锁]")
                    .replace("📊", "[图表]")
                    .replace("🤖", "[机器人]")
                    .replace("💡", "[灯泡]")
                    .replace("⚙️", "[设置]")
                    .replace("📢", "[公告]")
                    .replace("🕐", "[时间]")
                    .replace("🎯", "[目标]")
                    .replace("👤", "[用户]")
                    .replace("📅", "[日历]")
                    .replace("📈", "[统计]")
                    .replace("🪑", "[座位]")
                    .replace("👥", "[用户组]");
        }

        // 如果支持emoji，则保持原样
        return text;
    }

    /**
     * 检查当前字体是否能显示emoji
     */
    private static boolean canDisplayEmoji() {
        if (emojiFont == null)
            return false;

        // 测试几个常用emoji
        return emojiFont.canDisplay(0x1F4CB) || // 📋
                emojiFont.canDisplay(0x1F916) || // 🤖
                emojiFont.canDisplay(0x1F4CA) || // 📊
                emojiFont.canDisplay(0x2699); // ⚙
    }

    /**
     * 为JLabel设置文本并优化emoji显示
     */
    public static void setEmojiText(JLabel label, String text) {
        setEmojiFont(label);
        label.setText(processEmojiText(text));
    }

    /**
     * 为JButton设置文本并优化emoji显示
     */
    public static void setEmojiText(JButton button, String text) {
        setEmojiFont(button);
        button.setText(processEmojiText(text));
    }

    /**
     * 获取系统可用字体信息（调试用）
     */
    public static void printAvailableFonts() {
        // 不再输出调试信息
    }
}
